home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 23
/
AACD 23.iso
/
AACD
/
Programming
/
Wipeout
/
source
/
addresstest.c
next >
Wrap
C/C++ Source or Header
|
2000-12-21
|
3KB
|
148 lines
/*
* $Id: addresstest.c 1.6 1998/04/13 09:39:45 olsen Exp olsen $
*
* :ts=4
*
* Wipeout -- Traces and munges memory and detects memory trashing
*
* Written by Olaf `Olsen' Barthel <olsen@sourcery.han.de>
* Public Domain
*/
#ifndef _GLOBAL_H
#include "global.h"
#endif /* _GLOBAL_H */
/******************************************************************************/
#define NOT_IN_RAM (0)
/******************************************************************************/
#define ROM_SIZE_OFFSET 0x13
/******************************************************************************/
BOOL
IsValidAddress(ULONG address)
{
BOOL isValid = FALSE;
/* Is this a valid RAM address? */
if(TypeOfMem((APTR)address) == NOT_IN_RAM)
{
extern LONG FAR romend;
const ULONG romEnd = (ULONG)&romend;
const ULONG romStart = romEnd - (*(ULONG *)(romEnd - ROM_SIZE_OFFSET));
/* Check if the address resides in ROM space. */
if(romStart <= address && address <= romEnd)
isValid = TRUE;
}
else
{
isValid = TRUE;
}
/* In this context "valid" means that the data stored
* at the given address is safe to read.
*/
return(isValid);
}
/******************************************************************************/
BOOL
IsInvalidAddress(ULONG address)
{
BOOL isInvalid;
isInvalid = (BOOL)(TypeOfMem((APTR)address) == NOT_IN_RAM);
/* In this context "invalid" means that the data stored
* at the given address is not located in RAM, but
* somewhere else.
*/
return(isInvalid);
}
BOOL
IsOddAddress(ULONG address)
{
BOOL isOdd;
isOdd = (BOOL)((address & 3) != 0);
return(isOdd);
}
/******************************************************************************/
BOOL
IsAllocatedMemory(ULONG address,ULONG size)
{
struct MemHeader * mh;
struct MemChunk * mc;
ULONG memStart;
ULONG memStop;
ULONG chunkStart;
ULONG chunkStop;
BOOL isAllocated = TRUE;
/* check whether the allocated memory overlaps with free
* memory or whether freeing it would result in part of
* an already free area to be freed
*/
memStart = address;
memStop = address + size-1;
Forbid();
for(mh = (struct MemHeader *)SysBase->MemList.lh_Head ;
mh->mh_Node.ln_Succ != NULL ;
mh = (struct MemHeader *)mh->mh_Node.ln_Succ)
{
for(mc = mh->mh_First ;
mc != NULL ;
mc = mc->mc_Next)
{
chunkStart = (ULONG)mc;
chunkStop = chunkStart + mc->mc_Bytes-1;
/* four cases are possible:
* 1) the chunk and the allocated memory do not overlap
* 2) the chunk and the allocated memory overlap at the beginning
* 3) the chunk and the allocated memory overlap at the end
* 4) the chunk and the allocated memory overlap completely
*/
if(memStop < chunkStart || memStart > chunkStop)
{
/* harmless */
}
else if (memStart <= chunkStart && memStop <= chunkStop)
{
isAllocated = FALSE;
break;
}
else if (chunkStart <= memStart && chunkStop <= memStop)
{
isAllocated = FALSE;
break;
}
else if ( memStart <= chunkStart && chunkStop <= memStop ||
chunkStart <= memStart && memStop <= chunkStop)
{
isAllocated = FALSE;
break;
}
}
}
Permit();
return(isAllocated);
}